const treeData = [
    {
      name: "擎天柱",
      id: 1,
      children: [
        {
          name: "大黄蜂",
          id: 10,
          children: [
            {
              name: "迪迦",
              id: 100,
            },
            {
              name: "泰罗",
              id: 101,
            },
          ],
        },
        {
          name: "蜘蛛侠",
          id: 11,
        },
      ],
    },
    {
      name: "威震天",
      id: 2,
      children: [],
    },
    {
      name: "机车人",
      id: 3,
      children: [
        {
          name: "太上老君",
          id: 30,
        },
        {
          name: "通天教主",
          id: 31,
          children: [
            {
              name: "孙悟空",
              id: 310,
              children: [
                {
                  name: "猪八戒",
                  id: 3100,
                },
              ],
            },
          ],
        },
      ],
    },
  ];


  /**
 * 获取树节点路径
 * @param {*} curKey 树节点标识的值
 * @param {array} data 树
 * @returns {array} result 存放搜索到的树节点到顶部节点的路径节点
 */
const getPathByKey = (curKey, data) => {
  /** 存放搜索到的树节点到顶部节点的路径节点 */
  let result = [];
  /**
   * 路径节点追踪
   * @param {*} curKey 树节点标识的值
   * @param {array} path 存放搜索到的树节点到顶部节点的路径节点
   * @param {*} data 树
   * @returns undefined
   */
  let traverse = (curKey, path, data) => {
    // 树为空时，不执行函数
    if (data.length === 0) {
      return;
    }

    // 遍历存放树的数组
    for (let item of data) {
      // 遍历的数组元素存入path参数数组中
      path.push(item);
      // 如果目的节点的id值等于当前遍历元素的节点id值
      if (item.id === curKey) {
        // 把获取到的节点路径数组path赋值到result数组
        result = JSON.parse(JSON.stringify(path));
        return;
      }

      // 当前元素的children是数组
      const children = Array.isArray(item.children) ? item.children : [];
      // 递归遍历子数组内容
      traverse(curKey, path, children);
      // 利用回溯思想，当没有在当前叶树找到目的节点，依次删除存入到的path数组路径
      path.pop();
    }
  };
  traverse(curKey, [], data);
  // 返回找到的树节点路径
  return result;
};

/** 对应树节点路径(数组形式) */
let pathList = getPathByKey(3100, treeData);
console.log("pathList", pathList); /* 
  pathList [
  { name: '机车人', id: 3, children: [ [Object], [Object] ] },
  { name: '通天教主', id: 31, children: [ [Object] ] },       
  { name: '孙悟空', id: 310, children: [ [Object] ] },        
  { name: '猪八戒', id: 3100 }
]
*/
/** 对应树节点路径 */
let pathUrl = pathList.map((item) => item).join(" / ");
console.log('pathUrl',pathUrl);/* 
  机车人 / 通天教主 / 孙悟空 / 猪八戒
*/
